/*
 * Lenovo Group
 * Copyright (c) 2015-2016 All Rights Reserved.
 * Project Name: lmrp-android app
 * Create Time: 16-2-16 下午6:45
 */

package com.lenovo.mso2o.util;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Environment;
import android.os.StatFs;
import android.provider.Settings;
import android.util.DisplayMetrics;

import com.lenovo.framework.util.DLog;
import com.lenovo.mso2o.R;
import com.lenovo.mso2o.conf.MSConstants;

import java.io.File;

public class CommonUtil {

    /*先介绍一下个人情况，本科方向是通信的，一战报考了清华的电子系，当时还很自信，结果332没进复试，去微电子系的调剂又被刷掉了，当时真的很沮丧。心里实在不甘心，决定二战之后，想给自己一个重新选择方向的机会就报考了计算机系。今年分数357，政治52，英语74，数学107，专业课124.每天的时间分布大概是专业课4个小时，数学4个小时，英语每天两篇阅读，政治最后1个月抱佛脚。
    政治英语一般般我就不多说了，之前有很多大神发经验贴，照着参考就是了。就说说数学和专业课。
    数学：考的一般，复习的时候主要看的是全书，在复习的过程中来来回回刷了3遍吧，顺便把660刷完。
    之后的时间就一直花在真题上，刷真题要掐表，看自己做一套的时间，这样才能比较好的估计你自己的水平，
    对完答案以后的错题不要马虎对待，看一下思路就算，
    错的还是重新做一遍，没想到思路的在看答案的时候要把答案的切入点找清楚，
    搞清楚他的思路，这样才不容易在考场上看到难题傻掉。
    真题刷完一遍以后很有自信了，做过两套张宇的八套卷，感觉难度太过，
    心想不会这样出的，就没做下去，现在真是特别后悔。考试的时候看到题目有些懵，
    选填就挺多题不确定的，大题又有几道不会做，就把能我能处理的公式都处理一遍，现在看起来应该拿到不少过程分。
            912:专业课从7月份学到了9月份，发现自己跨专业的基础还是太薄弱，
            由于今年新改专业课，和408相比数据结构加到了70分，而其他几门的分数都略有下降，
            在学堂上报了邓公的数据结构，一直学到考研最后。在这里强烈推荐邓公的课程，
            知识点讲得很细致，然后如果有时间可以试着做做他的oj作业题，
            我当时一直做到cs课堂结果时间真心不够了才没继续下去，对数据结构加深理解很有帮助，
            而且老师很认真，人非常nice。然后买了殷人昆的数据结构精讲与习题详解－考研辅导与答疑解惑，
            刷完了这本书，这本书有些难度，确实超过了408甚至912的难度不少，建议可以选一些低难度的例题做一下。
    此外的三门我都是以408书籍作为主基地的，大概流程都是先刷一遍王道的书，
    然后把习题跟着做完，然后在不懂的地方再去看三本教材，然后再刷408真题以及复习王道单科书，
    最重要记住千万不能马虎，做习题的时候有什么小点不确定也一定要搞明白原理，
    抱着一个学好这三门课而不是背答案的心态去看书，以不变应万变。
    最后在12月份的时候开始做王道的模拟题，会觉得数据结构相对容易做了，然后其他三门要查缺补漏，
    模拟卷这三门还是很有难度的。最后小贴士是我当时没太注意组成原理，
    之后才了解到还要学习系统结构的相关知识，今年912组成的大题挺难的，
    看了半天没看出门道，流水线的题，希望学弟学妹们把这方面的知识多多补齐。
    差不多就说这些，祝大家考研成功。*/


    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm =
                (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = cm.getActiveNetworkInfo();
        return netInfo != null && netInfo.isConnected();
    }

    //是否连接WIFI
    public static boolean isWifiConnected(Context context)
    {
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if(wifiNetworkInfo.isConnected())
        {
            return true ;
        }
        return false ;
    }

    /**
     * 检测sdcard是否可用
     *
     * @return true为可用，否则为不可用
     */
    public static boolean sdCardIsAvailable() {
        String status = Environment.getExternalStorageState();
        if (!status.equals(Environment.MEDIA_MOUNTED))
            return false;
        return true;
    }

    /**
     * Checks if there is enough Space on SDCard
     *
     * @param updateSize Size to Check
     * @return True if the Update will fit on SDCard, false if not enough space
     * on SDCard Will also return false, if the SDCard is not mounted as
     * read/write
     */
    public static boolean enoughSpaceOnSdCard(long updateSize) {
        String status = Environment.getExternalStorageState();
        if (!status.equals(Environment.MEDIA_MOUNTED))
            return false;
        return (updateSize < getRealSizeOnSdcard());
    }

    /**
     * get the space is left over on sdcard
     */
    public static long getRealSizeOnSdcard() {
        File path = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath());
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();
        return availableBlocks * blockSize;
    }

    /**
     * Checks if there is enough Space on phone self
     */
    public static boolean enoughSpaceOnPhone(long updateSize) {
        return getRealSizeOnPhone() > updateSize;
    }

    /**
     * get the space is left over on phone self
     */
    public static long getRealSizeOnPhone() {
        File path = Environment.getDataDirectory();
        StatFs stat = new StatFs(path.getPath());
        long blockSize = stat.getBlockSize();
        long availableBlocks = stat.getAvailableBlocks();
        long realSize = blockSize * availableBlocks;
        return realSize;
    }

    /**
     * 根据手机分辨率从dp转成px
     *
     * @param context
     * @param dpValue
     * @return
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f) - 15;
    }

    public static String getAppName(Context paramContext) {
        return paramContext.getResources().getText(R.string.app_name)
                .toString();
    }

    public static int  getScreenWidth(Activity context){
        DisplayMetrics dm = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }

    public static int getVerCode(Context paramContext) {
        PackageInfo pInfo;
        try {
            pInfo = paramContext.getPackageManager().getPackageInfo(
                    paramContext.getPackageName(), 0);
            return pInfo.versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static String getVerName(Context paramContext) {
        try {
            return paramContext.getPackageManager().getPackageInfo(
                    paramContext.getPackageName(), 0).versionName;
        } catch (Exception localException) {
            DLog.e("config", localException.getMessage());
        }
        return "";
    }

    public static String getOwnedDataDir(Context context){
        if(CommonUtil.checkSDCARD()){
            return Environment.getExternalStorageDirectory()+File.separator+ MSConstants.DataConstants.DATA_DIR;
        }
        else{
            return context.getCacheDir().getAbsolutePath()+File.separator+ MSConstants.DataConstants.DATA_DIR;
        }
    }
    /**
     * 检查SD卡是否插入
     *
     * @return
     *
     */
    public static boolean checkSDCARD() {

        String status = Environment.getExternalStorageState();
        if (status.equals(Environment.MEDIA_MOUNTED)) {
            return true;
        }
        return false;
    }

    public static boolean isGPSEnable(Context context) {
        String str = Settings.Secure.getString(context.getContentResolver(),
                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        if (str != null) {
            return str.contains("gps");
        } else {
            return false;
        }
    }

    public static void setGPSEnable(Context context, boolean bEnabled) {
        if (bEnabled == isGPSEnable(context))
            return;
        Intent gpsIntent = new Intent();
        gpsIntent.setClassName("com.android.settings",
                "com.android.settings.widget.SettingsAppWidgetProvider");
        gpsIntent.addCategory("android.intent.category.ALTERNATIVE");
        gpsIntent.setData(Uri.parse("custom:3"));
        try {
            PendingIntent.getBroadcast(context, 0, gpsIntent, 0).send();
        } catch (PendingIntent.CanceledException e) {
            e.printStackTrace();
        }
    }
    public static void gotoGpsSystemSetting(Activity activity) {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        activity.startActivityForResult(intent, 0);

    }
}
